package com.google.code.memoriesalbum.util;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.lang.StringUtils;
import org.slim3.datastore.Datastore;
import org.slim3.datastore.EntityNotFoundRuntimeException;

import com.google.code.memoriesalbum.model.Account;

/**
 * @author shin1ogawa
 */
public class WebHandlerUtil {

	private WebHandlerUtil() {
	}

	/**
	 * 指定されたリクエストの状態で認証できるmemories albumサービスのユーザアカウントを返す。
	 * <p>認証できなかった場合は、{@code response}にエラー情報を書き込むのでリクエストハンドラでは何もせずにリクエストを終了すること。</p>
	 * @param request
	 * @param response
	 * @return 認証できれば{@link Account}, 認証できなければ{@code null}.
	 */
	public static Account getAccount(HttpServletRequest request, HttpServletResponse response) {
		String id = request.getHeader(Constants.X_HEADER_ID);
		String token = request.getHeader(Constants.X_HEADER_TOKEN);
		if (StringUtils.isEmpty(id) || StringUtils.isEmpty(token)) {
			WebHandlerUtil.errorResponse(request, response, HttpServletResponse.SC_UNAUTHORIZED,
					"UNAUTHORIZED");
			return null;
		}
		Account account = null;
		try {
			account = Datastore.get(Account.class, Datastore.createKey(Account.class, id));
		} catch (EntityNotFoundRuntimeException e) {
			WebHandlerUtil.errorResponse(request, response, HttpServletResponse.SC_UNAUTHORIZED,
					"UNAUTHORIZED");
			return null;
		}
		if (StringUtils.equals(account.getToken(), token) == false) {
			WebHandlerUtil.errorResponse(request, response, HttpServletResponse.SC_UNAUTHORIZED,
					"UNAUTHORIZED");
			return null;
		}
		return account;
	}

	/**
	 * クライアント側にエラーを返す。
	 * <p>{@link Constants#X_HEADER_ERRORMESSAGE}ヘッダフィールドにエラーメッセージを設定する。</p>
	 * @param request
	 * @param response
	 * @param status HTTPのステータスコード
	 * @param message レスポンスするエラーメッセージ
	 */
	public static void errorResponse(HttpServletRequest request, HttpServletResponse response,
			int status, String message) {
		response.setStatus(status);
		response.addHeader(Constants.X_HEADER_ERRORMESSAGE, message);
	}
}
